home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / calmanfp.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  4KB  |  211 lines

  1. /* calmanfp.c
  2.  * This file contains routines to replace calmanfp.asm.
  3.  *
  4.  * This file Copyright 1992 Ken Shirriff.  It may be used according to the
  5.  * fractint license conditions, blah blah blah.
  6.  */
  7.  
  8. #include "fractint.h"
  9. #include "fractype.h"
  10.  
  11. extern struct complex init, parm, new;
  12.  
  13. extern int color, oldcolor, realcolor, periodicitycheck, reset_periodicity,
  14.     fractype, kbdcount, dotmode, show_orbit, orbit_ptr, potflag, maxit,
  15.     inside, outside, fpu;
  16.  
  17. extern double closenuff, magnitude, rqlim;
  18.  
  19. static int tmp_word, inside_color, periodicity_color;
  20.  
  21. calcmandfpasmstart() {
  22.     if (inside<0) {
  23.     inside_color = maxit;
  24.     } else {
  25.     inside_color = inside;
  26.     }
  27.  
  28.     if (periodicitycheck < 0) {
  29.     periodicity_color = 7;
  30.     } else {
  31.     periodicity_color = inside_color;
  32.     }
  33.     oldcolor = 0;
  34.     return 0;
  35. }
  36.  
  37. #define ABS(x) ((x)>0?(x):-(x))
  38. #define close 0.01
  39.  
  40. calcmandfpasm() {
  41.     int cx;
  42.     int savedand;
  43.     double x,y,x2, y2, xy, Cx, Cy, savedx, savedy;
  44.     int savedincr;
  45.  
  46.     if (periodicitycheck==0 || periodicitycheck == -59) {
  47.     oldcolor = 0;
  48.     } else if (reset_periodicity==0) {
  49.     oldcolor = maxit-250;
  50.     }
  51.  
  52.     /* initparms */
  53.     savedx = 0;
  54.     savedy = 0;
  55.     savedand = 1;
  56.     savedincr = 1;
  57.     orbit_ptr = 0;
  58.     kbdcount--; /* Only check the keyboard sometimes */
  59.     if (kbdcount<0) {
  60.     int key;
  61.     kbdcount = 1000;
  62.     key = keypressed();
  63.     if (key) {
  64.         if (key=='o' || key=='O') {
  65.         getakey();
  66.         show_orbit = 1-show_orbit;
  67.         } else {
  68.         color = -1;
  69.         return -1;
  70.         }
  71.     }
  72.     }
  73.  
  74.     cx = maxit;
  75.  
  76.     if (fractype != JULIAFP && fractype != JULIA) {
  77.     /* Mandelbrot_87 */
  78.     cx--;
  79.     Cx = init.x;
  80.     Cy = init.y;
  81.     x = parm.x+Cx;
  82.     y = parm.y+Cy;
  83.     } else {
  84.     /* dojulia_87 */
  85.     Cx = parm.x;
  86.     Cy = parm.y;
  87.     x = init.x;
  88.     y = init.y;
  89.     }
  90.     x2 = x*x;
  91.     y2 = y*y;
  92.     xy = x*y;
  93.  
  94.     /* top_of_cs_loop_87 */
  95.     do {
  96.     x = x2-y2+Cx;
  97.     y = 2*xy+Cy;
  98.     if (outside<=-2) {
  99.         new.x = x;
  100.         new.y = y;
  101.     }
  102.     /* no_save_new_xy_87 */
  103.     if (inside==-100) {
  104.         /* epsilon_cross */
  105.         if (ABS(x)<0.01) {
  106.         realcolor = maxit-cx;
  107.         if (realcolor==0) realcolor++;
  108.         kbdcount -= realcolor;
  109.         color = GREEN;
  110.         oldcolor = 0;
  111.         goto pop_stack;
  112.         } else if (ABS(y)<0.01) {
  113.         realcolor = maxit-cx;
  114.         if (realcolor==0) realcolor++;
  115.         kbdcount -= realcolor;
  116.         color = BROWN;
  117.         oldcolor = 0;
  118.         goto pop_stack;
  119.         }
  120.     }
  121.     /* end_epsilon_cross_87 */
  122.     if (cx<oldcolor) {
  123.         if (savedand==0) {
  124.         savedx = x;
  125.         savedy = y;
  126.         savedincr--;
  127.         if (savedincr==0) {
  128.             savedand = (savedand<<1) + 1;
  129.             savedincr = 4;
  130.         } else {
  131.             if (ABS(x-savedx)<closenuff && ABS(y-savedy)<closenuff) {
  132.             oldcolor = 65535;
  133.             realcolor = maxit;
  134.             kbdcount = kbdcount-(maxit-cx);
  135.             color = periodicity_color;
  136.             goto pop_stack;
  137.             }
  138.         }
  139.         }
  140.     }
  141.     /* no_periodicity_check_87 */
  142.     if (show_orbit != 0) {
  143.         plot_orbit(x,y,-1);
  144.     }
  145.     /* no_show_orbit_87 */
  146.     x2 = x*x;
  147.     y2 = y*y;
  148.     xy = x*y;
  149.     if (potflag != 0) {
  150.         magnitude = x2+y2;
  151.     }
  152.     if (x2+y2 > rqlim) {
  153.         goto over_bailout_87;
  154.     }
  155.  
  156.     cx--;
  157.     } while (cx>0);
  158.  
  159.     /* reached maxit */
  160.     oldcolor = 65535;
  161.     kbdcount -= maxit;
  162.     realcolor = maxit;
  163.     if (inside==-59) {
  164.     color = (x2+y2)*maxit/2+1;
  165.     } else {
  166.         color = inside_color;
  167.     }
  168.  
  169. pop_stack:
  170.     
  171.     if (orbit_ptr) {
  172.     scrub_orbit();
  173.     }
  174.  
  175.     return color;
  176.  
  177. over_bailout_87:
  178.     if (cx-10>=0) {
  179.     oldcolor = cx-10;
  180.     } else {
  181.     oldcolor = 0;
  182.     }
  183.     color = realcolor = maxit-cx;
  184.     if (realcolor==0) realcolor = 1;
  185.     kbdcount -= realcolor;
  186.     if (outside==-1) {
  187.     } else if (outside>-2) {
  188.     color = outside;
  189.     } else {
  190.     /* special_outside */
  191.     int ax;
  192.     if (outside==-2) {
  193.         color += new.x + 7;
  194.     } else if (outside==-3) {
  195.         color += new.y + 7;
  196.     } else if (outside==-4) {
  197.         if (new.y!=0) {
  198.         color *= new.x/new.y;
  199.         }
  200.     } else if (outside==-5) {
  201.         color +=  new.x + new.y;
  202.     }
  203.     /* check_color */
  204.     if (color<0 || color>maxit) {
  205.         color = 0;
  206.     }
  207.     }
  208.     goto pop_stack;
  209.  
  210. }
  211.